package br.com.upis.sispat.view;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.upis.sispat.entity.AlocacaoPatrimonio;
import br.com.upis.sispat.entity.Patrimonio;
import br.com.upis.sispat.entity.Requisicao;
import br.com.upis.sispat.enums.Perfil;
import br.com.upis.sispat.enums.StatusRequisicao;
import br.com.upis.sispat.enums.TipoPatrimonio;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.exception.SeamWebException;
import br.com.upis.sispat.service.AlocacaoPatrimonioService;
import br.com.upis.sispat.service.PatrimonioService;
import br.com.upis.sispat.service.RequisicaoService;

@Component
@Scope("singleton")
public class RequisicaoView extends AbstractView implements ICommandPopup {

	private static final long serialVersionUID = -993431214631653901L;
	private static final String PATH_LISTA_REQUISICAO = CONTEXT	+ "/requisicao/listarRequisicao";
	private static final String PATH_EDITA_REQUISICAO = CONTEXT	+ "/requisicao/editarRequisicao";
	private static final String PATH_DETALHA_REQUISICAO = CONTEXT + "/requisicao/detalharRequisicao";
	private List<Requisicao> listaRequisicao;
	private Requisicao requisicao;
	private List<Patrimonio> listaPatrimonio;
	private Patrimonio patrimonio;
	private Requisicao requisicaoPesquisa;
	private RequisicaoService requisicaoService;
	private SelectItem[] listaTipoPatrimonio;
	private SelectItem[] listaStatusReq;

	private PatrimonioService patrimonioService;
	private AlocacaoPatrimonioService alocacaoPatrimonioService;
	
	@PostConstruct
	public void init() {

		setRequisicao(new Requisicao());
		setExibePopup(false);
		setExibeMsgNenhumRegistroEncontrado(false);
	}
	
	public String listaValitarReq(){
		if(recuperaUsuarioLogado().getIdAcesso()!=2){
			return null;
		}
		getRequisicaoPesquisa().setStatusRequisicao(StatusRequisicao.AGUARDANDO_APROVACAO.getCodigoRequisicao());
		getRequisicaoPesquisa().setIdSetorPerfilNaoGestor(recuperaUsuarioLogado().getSetor().getCodigo().intValue());
		try {
			setListaRequisicao(requisicaoService.search(getRequisicaoPesquisa()));
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}
		setExibeMsgNenhumRegistroEncontrado(getListaRequisicao().isEmpty());
		return PATH_LISTA_REQUISICAO;
	}
	
	public String listaAlocarReq(){
		if(recuperaUsuarioLogado().getIdAcesso()!=1){
			return null;
		}
		getRequisicaoPesquisa().setStatusRequisicao(StatusRequisicao.APROVADO.getCodigoRequisicao());
		try {
			setListaRequisicao(requisicaoService.search(getRequisicaoPesquisa()));
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}
		setExibeMsgNenhumRegistroEncontrado(getListaRequisicao().isEmpty());
		return PATH_LISTA_REQUISICAO;
	}

	public String iniciar() {

		init();

		setRequisicaoPesquisa(new Requisicao());
		setListaRequisicao(new ArrayList<Requisicao>());
		setListaPatrimonio(new ArrayList<Patrimonio>());

		return redirecionaRequisicaoAcesso(PATH_LISTA_REQUISICAO);
	}

	public String voltar() throws SeamWebException {

		if (!getListaRequisicao().isEmpty()) {
			try {
				setListaRequisicao(requisicaoService.search(getRequisicaoPesquisa()));
			} catch (SeamCoreException e) {
				throw new SeamWebException(e);
			}
		} else {
			init();
		}

		return PATH_LISTA_REQUISICAO;
	}

	private String redirecionaRequisicaoAcesso(String path) {

		if (getListaRequisicao().isEmpty()) {

			return path;
		}

		return pesquisar();
	}

	
	public String pesquisarPatrimonio(){
		
		Patrimonio patrimonio = new Patrimonio();
		
		patrimonio.setTipoPatrimonio(getRequisicao().getTipoPatrimonio());
		patrimonio.getSetor().setCodigo(1L);
		
		try {
			listaPatrimonio = patrimonioService.search(patrimonio);
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}
		setExibeMsgNenhumRegistroEncontrado(getListaPatrimonio().isEmpty());
		return PATH_EDITA_REQUISICAO;
	}
	
	public String alocarPatrimonio(){
		AlocacaoPatrimonio alocacaoPatrimonio = new AlocacaoPatrimonio();
		alocacaoPatrimonio.setDataAlocacao(new Date());
		alocacaoPatrimonio.getPk().setPatrimonio(getPatrimonio());
		alocacaoPatrimonio.getPk().setRequisicao(getRequisicao());
		alocacaoPatrimonio.getPk().setUsuario(getRequisicao().getUsuario());
		getPatrimonio().setSetor(getRequisicao().getUsuario().getSetor());
		getRequisicao().setPatrimonio(getPatrimonio());
		getRequisicao().setStatusRequisicao(StatusRequisicao.DISPONIBILIZADO.getCodigoRequisicao());
		
		try {
			requisicaoService.update(getRequisicao());
			patrimonioService.update(getPatrimonio());
			alocacaoPatrimonioService.save(alocacaoPatrimonio);
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}
		
		return PATH_LISTA_REQUISICAO;
	}
	
	public String pesquisar() {
		switch (recuperaUsuarioLogado().getIdAcesso()) {
		case 2:
			getRequisicaoPesquisa().setIdSetorPerfilNaoGestor(recuperaUsuarioLogado().getSetor().getCodigo().intValue());
			break;
		case 3:
			getRequisicaoPesquisa().setIdSetorPerfilNaoGestor(recuperaUsuarioLogado().getSetor().getCodigo().intValue());
			getRequisicaoPesquisa().setIdUsuarioPerfilNaoGestor(recuperaUsuarioLogado().getCodigo().intValue());
			break;
		default:
			break;
		}

		try {
			setListaRequisicao(requisicaoService.search(getRequisicaoPesquisa()));
		} catch (SeamCoreException e) {

			e.printStackTrace();
		}
		setExibeMsgNenhumRegistroEncontrado(getListaRequisicao().isEmpty());
		return PATH_LISTA_REQUISICAO;
	}

	public String novo() {

		if (!isExibePopup()) {
			init();
			getRequisicao().setUsuario(recuperaUsuarioLogado());
			getRequisicao().setDataReqisicao(new Date());
		}
		
		return PATH_EDITA_REQUISICAO;
	}

	public String detalhar() {

		return PATH_DETALHA_REQUISICAO;
	}

	public String editar() throws SeamWebException {
		setListaPatrimonio(new ArrayList<Patrimonio>());

		return PATH_EDITA_REQUISICAO;
	}

	public String salvar() throws SeamWebException {
		getRequisicao().setStatusRequisicao(StatusRequisicao.AGUARDANDO_APROVACAO.getCodigoRequisicao());
		try {

			requisicaoService.save(requisicao);

			addMessageInfo("sucesso.salvo");

		} catch (SeamCoreException e) {

			throw new SeamWebException(e);
		}

		return redirecionaRequisicaoAcesso(PATH_LISTA_REQUISICAO);
	}

	public String atualizar() throws SeamWebException {
		try {

			requisicaoService.update(requisicao);

			addMessageInfo("sucesso.atualizado");

		} catch (SeamCoreException e) {

			throw new SeamWebException(e);
		}

		return redirecionaRequisicaoAcesso(PATH_LISTA_REQUISICAO);
	}

	public SelectItem[] getListaStatusReq() {
		listaStatusReq = new SelectItem[StatusRequisicao.getListRequisicao().size()];

		int i = 0;

		for (StatusRequisicao p : StatusRequisicao.getListRequisicao()) {
			listaStatusReq[i++] = new SelectItem(p.getCodigoRequisicao(), p.getDescricao());
		}

		return listaStatusReq;
	}
	
	public void setListaStatusReq(SelectItem[] listaStatusReq) {
		this.listaStatusReq = listaStatusReq;
	}

	public List<Requisicao> getListaRequisicao() {
		return listaRequisicao;
	}

	public void setListaRequisicao(List<Requisicao> listaRequisicao) {
		this.listaRequisicao = listaRequisicao;
	}

	public Requisicao getRequisicao() {
		return requisicao;
	}

	public void setRequisicao(Requisicao requisicao) {
		this.requisicao = requisicao;
	}

	@Autowired
	public void setRequisicaoService(RequisicaoService requisicaoService) {
		this.requisicaoService = requisicaoService;
	}

	public Requisicao getRequisicaoPesquisa() {
		if(requisicaoPesquisa==null){
			requisicaoPesquisa = new Requisicao();
		}
		return requisicaoPesquisa;
	}

	public void setRequisicaoPesquisa(Requisicao requisicaoPesquisa) {
		this.requisicaoPesquisa = requisicaoPesquisa;
	}

	@Override
	public String excluir() throws SeamWebException {

		try {
			requisicaoService.delete(getRequisicao());

			addMessageInfo("sucesso.excluido");

		} catch (SeamCoreException e) {
			throw new SeamWebException(e);
		}

		return PATH_LISTA_REQUISICAO;
	}

	@Override
	public boolean possuiAcesso(Perfil perfil) {
		return !isPerfilGestor();
	}

	@Override
	public String execute() throws SeamWebException {

		String path = "";

		switch (getAcaoPopUp()) {
		case 1:
			excluir();
			path = pesquisar();
			break;

		case 2:
			path = atualizar();
			break;

		case 3:
			path = salvar();
			break;

		default:
			break;
		}

		return path;
	}

	@Override
	public boolean validaForm() throws SeamWebException {

		return false;
	}

	public SelectItem[] getListaTipoPatrimonio() {

		listaTipoPatrimonio = new SelectItem[TipoPatrimonio.getListaTipoPatrimonio().size()];

		int i = 0;

		for (TipoPatrimonio p : TipoPatrimonio.getListaTipoPatrimonio()) {
			listaTipoPatrimonio[i++] = new SelectItem(p.getValor(), p.getDescricao());
		}

		return listaTipoPatrimonio;
	}

	public void setListaTipoPatrimonio(SelectItem[] listaTipoPatrimonio) {
		this.listaTipoPatrimonio = listaTipoPatrimonio;
	}

	public List<Patrimonio> getListaPatrimonio() {
		return listaPatrimonio;
	}

	public void setListaPatrimonio(List<Patrimonio> listaPatrimonio) {
		this.listaPatrimonio = listaPatrimonio;
	}

	@Autowired
	public void setPatrimonioService(PatrimonioService patrimonioService) {
		this.patrimonioService = patrimonioService;
	}

	public Patrimonio getPatrimonio() {
		return patrimonio;
	}

	public void setPatrimonio(Patrimonio patrimonio) {
		this.patrimonio = patrimonio;
	}

	@Autowired
	public void setAlocacaoPatrimonioService(
			AlocacaoPatrimonioService alocacaoPatrimonioService) {
		this.alocacaoPatrimonioService = alocacaoPatrimonioService;
	}

}
